﻿using EightOData.Extensions.Layout;
using EightOData.Model;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Navigation;

namespace EightOData
{
    public sealed partial class WishListPage
    {
        #region Properties

        public ObservableCollection<GroupInfoList<WishList>> WishLists { get; private set; }

        #endregion

        #region Constructor

        /// <summary>
        /// Initialisation d'une page de type WishListPage.
        /// </summary>
        public WishListPage()
        {
            InitializeComponent();
            LoadDataAsync();
        }

        #endregion

        #region Methods

        /// <summary>
        /// Chargement asynchrone des données.
        /// </summary>
        private void LoadDataAsync()
        {
            WishLists = new ObservableCollection<GroupInfoList<WishList>>();

            // Jeux de données de test
            var wishLists = new List<WishList>();
            wishLists.Add(new WishList { Name = "My Wish List", Gifts = new List<Gift>(), Owner = new User { FirstName = "David" }, Image = new Uri("ms-appx:///Assets/tuile liste vide.jpg", UriKind.RelativeOrAbsolute) });
            wishLists.Add(new WishList { Name = "His Wish List", Gifts = new List<Gift>(), Owner = new User { FirstName = "Vincent" }, Image = new Uri("ms-appx:///Assets/tuile liste vide.jpg", UriKind.RelativeOrAbsolute) });
            wishLists.Add(new WishList { Name = "Her Wish List", Gifts = new List<Gift>(), Owner = new User { FirstName = "Maëlys" }, Image = new Uri("ms-appx:///Assets/tuile liste vide.jpg", UriKind.RelativeOrAbsolute) });
            wishLists.Add(new WishList { Name = "Their Wish List", Gifts = new List<Gift>(), Owner = new User { FirstName = "Frédéric" }, Image = new Uri("ms-appx:///Assets/tuile liste vide.jpg", UriKind.RelativeOrAbsolute) });

            // Sélection des listes de cadeaux par groupe
            foreach (var group in wishLists
                .GroupBy(x => x.Name[0])
                .OrderBy(x => x.Key)
                .Select(x => new { GroupName = x.Key, Items = x }))
            {
                var info = new GroupInfoList<WishList> { Key = group.GroupName };

                foreach (var item in group.Items)
                    info.Add(item);

                WishLists.Add(info);
            }

            DataContext = this;

            // Mise à jour des données du zoom sémantique
            (SemanticZoom.ZoomedOutView as ListViewBase).ItemsSource = DataSource.View.CollectionGroups;
        }

        #endregion

        #region Events

        /// <summary>
        /// Effectue la navigation vers la page d'édition de cadeaux.
        /// </summary>
        private void Add_Click(object sender, RoutedEventArgs e)
        {
            Frame.Navigate(typeof(WishListEditionPage));
        }

        /// <summary>
        /// Supprime la liste de voeux sélectionnée.
        /// </summary>
        private void Delete_Click(object sender, RoutedEventArgs e)
        {
            if (ContentGrid.SelectedItem == null)
                return;

            // Recherche de la collection contenant l'élément sélectionné puis suppression de l'élément
            var group = WishLists.Single(x => x.Contains(ContentGrid.SelectedItem));
            group.Remove(ContentGrid.SelectedItem);

            // Suppression du groupe s'il ne contient plus aucun élément
            if (!group.Any())
                WishLists.Remove(group);
        }

        /// <summary>
        /// Navigue vers la page d'édition de la liste de cadeaux sélectionnée.
        /// </summary>
        private void Edit_Tapped(object sender, TappedRoutedEventArgs e)
        {
            Frame.Navigate(typeof(WishListEditionPage), ContentGrid.SelectedItem);
        }

        /// <summary>
        /// Affiche ou non l'icône d'édition de liste de cadeaux à l'ouverture de l'AppBar.
        /// </summary>
        private void AppBar_Opened(object sender, object e)
        {
            EditButton.Visibility = ContentGrid.SelectedItem != null ? Visibility.Visible : Visibility.Collapsed;
        }

        /// <summary>
        /// A l'arrivée sur la page, ajoute la liste de cadeaux passées en paramètre dans le groupe correspondant.
        /// Le groupe est créé s'il n'existe pas.
        /// </summary>
        /// <param name="e">Paramètres de navigation</param>
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            // Réinitialisation de la sélection
            ContentGrid.SelectedIndex = -1;
            BottomAppBar.IsOpen = false;

            if (e.Parameter != null && e.Parameter is WishList)
            {
                var wishList = e.Parameter as WishList;
                var letter = wishList.Name[0].ToString().ToUpper();
                var existingGroup = WishLists.SingleOrDefault(x => x.Key.ToString().ToUpper() == letter);

                if (existingGroup != null)
                {
                    existingGroup.Add(wishList);
                }
                else
                {
                    var group = new GroupInfoList<WishList> { Key = letter };
                    group.Add(wishList);
                    WishLists.Add(group);
                }
            }
        }

        #endregion
    }
}
